package com.mystudy.springcloud.controller;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.TimeUnit;

@RestController
@Slf4j
public class FlowLimitController {
	@GetMapping("/libai")
	public String libai() {
		return "何处是归程，长亭更短亭。";
	}

	@GetMapping("/dufu")
	public String dufu() throws InterruptedException {
		// 模拟处理完这个业务需要1秒的时间
		// TimeUnit.SECONDS.sleep(1);
		return "回首向来萧瑟处，归去，也无风雨也无晴。";
	}

	/**
	 * @功能: 测试服务降级 - 访问次数
	 */
	@GetMapping("/rt")
	public String rt() throws InterruptedException {
		// 模拟处理完这个业务需要1秒的时间
		TimeUnit.SECONDS.sleep(1);
		log.info("测试服务降级 - RT（平均响应时间）");
		return "测试服务降级 - RT（平均响应时间）";
	}

	/**
	 * @功能: 测试服务降级 - 异常比例
	 */
	@GetMapping("/ycbl")
	public String ycbl() throws InterruptedException {
		int i = 1 / 0;
		log.info("测试服务降级 - 异常比例（20%）");
		return "测试服务降级 - 异常比例（20%）";
	}

	/**
	 * @功能: 测试服务降级 - 异常数
	 */
	@GetMapping("/error/count")
	public String errorCount() {
		int i = 1 / 0;
		log.info("测试服务降级 - 异常数（10个）");
		return "测试服务降级 - 异常数（10个）";
	}

	/**
	 * @功能: 测试热点参数限流
	 */
	@GetMapping("/hotkey")
	@SentinelResource(value = "hotkey", blockHandler = "deal_hotkey")
	public String hotKey(
			@RequestParam(value = "p1", required = false) String p1,
			@RequestParam(value = "p1", required = false) String p2) {
		// int i = 1 / 0;
		return "测试热点参数限流";
	}

	/**
	 * @功能: 测试热点参数方法限流的兜底方法
	 */
	public String deal_hotkey(String p1, String p2, BlockException exception) {
		return "测试热点参数方法限流的兜底方法";
	}
}
